/**
**********************************************************************************************************************************************************************************************************************************
* @file:	FinalMod.h
* @author:	zinface
* @date:	2021年11月10日 14:49:03 星期三
* @brief:	FinalMod 规则制定有关程序扩展的相关标准
**********************************************************************************************************************************************************************************************************************************
**/

#ifndef __FINALMOD__H__
#define __FINALMOD__H__

#include "FinalC.h"

#include <dlfcn.h>

// 内建信息开关
#define FinalMod_DEBUG false

#ifdef FINALC // if include FinalC, will be support

#define FinalMod_Module_Define(module)              \
    FinalC_Object_Define(module)

// Common FinalMod Define
// #define FinalMod_Module_Init(_init)             \
//     void final_mod##_init()
// #define FinalMod_Module_Exit(_exit)             \
//     void 

// ---------------------------------------------- Meta
FinalMod_Module_Define(FinalModMeta) {
    char *meta_name;
    char *meta_descript;
    char *meta_version;
};

#define FinalMod_META_SYM "finalmod_meta"
#define FinalMod_Module_MetaData_Define()                   \
    FinalModMeta finalmod_meta = 
#define FinalMod_Module_MetaData(name, descript, version)   \
    FinalMod_Module_MetaData_Define() {                     \
        .meta_name = name,                                  \
        .meta_descript = descript,                          \
        .meta_version = version,                            \
    };                                                      \

// ---------------------------------------------- Wrap
FinalMod_Module_Define(FinalModWrap) {
    char *wrap_name;
    char *wrap_descript;
    void *wrap_data;
};

#define FINALMOD_WRAP_SYM "finalmod_wrap"
#define FinalMod_Module_WrapData_Define()               \
    FinalModWrap finalmod_wrap =
#define FinalMod_Module_WrapData(name, descript, data)  \
    FinalMod_Module_WrapData_Define() {                 \
        .wrap_name = name,                              \
        .wrap_descript = descript,                      \
        .wrap_data = data                               \
    };                                                  \

// Redefine: dlopen param redefine
FinalC_Enum_Define(FinalModloadMode) {
    /** 立即加载到内存 */
    Now = RTLD_NOW,
    /** 在使用时加载 */
    Delay = RTLD_LAZY,
};
#define FinalMod_Module_Open(path, mode)        \
    dlopen(path, mode)
#define FinalMod_Module_ReadSym(dl, name)       \
    dlsym(dl, name)
#define FinalMod_Module_Close(dl)               \
    dlclose(dl)

#endif  //FINALC

#endif  //!__FINALMOD__H__
